package cifreromane;

import java.awt.Component;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class Principal extends JFrame implements ActionListener {
    //Cele 3 variabile determina cei 3 parametrii ai ferestrei
    //Cele 2 casete text (parametru si rezultat) si butonul
    //la a carui apasare se face calculul
    JButton submit;
    JTextField parametru;
    JTextField rezultat;
    
    public void creareMediuGrafic(){
        //'fereastra' este containerul in care vor fi asezate
        //butoanele si casutele text
        JFrame fereastra = new JFrame();
        fereastra.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fereastra.setAlwaysOnTop(true);
        Container suprafata = fereastra.getContentPane();
        suprafata.setLayout(new BoxLayout(suprafata,BoxLayout.Y_AXIS));
        
        //obiectele se aseaza pe rand in zona de reprezentare 
        //a ferestrei obtinuta cu getContentPane()
        JLabel info = new JLabel("Introduceti numarul in cifre romane: ");
        info.setAlignmentX(Component.CENTER_ALIGNMENT);
        suprafata.add(info);
        
        parametru = new JTextField(12);
        parametru.setAlignmentX(Component.CENTER_ALIGNMENT);
        suprafata.add(parametru);
        
        submit = new JButton("Calculeaza");
        submit.setAlignmentX(Component.CENTER_ALIGNMENT);
        suprafata.add(submit);
        submit.addActionListener(this);
        
        rezultat = new JTextField(12);
        rezultat.setAlignmentX(Component.CENTER_ALIGNMENT);
        suprafata.add(rezultat);
        rezultat.setEditable(false);
        
        //se incarca elementele in fereastra, functia pack
        //si se face fereastra vizibila
        fereastra.pack();
        fereastra.setVisible(true);
    }
    
    //functia care 'asculta' la apasarea butonului
    public void actionPerformed(ActionEvent event) {
        if(event.getSource().equals(submit)) {
            rezultat.setText(calculat(parametru.getText()));
        }
    }
    
    //functia in care se face trimiterea spre functiile
    //de interpretare din diferitele clase de interpretare
    public String calculat(String sirPars) {
        //de tip context este rezultatul care va fi dat
        //ca parametru diferitelor functii
        //interpretor pentru a fi modificat
        Context rezultat = new Context();
        sirPars = sirPars.toUpperCase();
        char[] lista = sirPars.toCharArray();
        for(char c : lista) {
            //ExpresieAbstracta este clasa abstracta care tine
            //antetul functiei interpretor
            ExpresieAbstracta expr = new ExpresieNula();
            switch(c) {
                case 'I': expr = new Unu();
                        break;
                case 'V': expr = new Cinci();
                        break;
                case 'X': expr = new Zece();
                        break;
                case 'L': expr = new CinciZeci();
                        break;
                case 'C': expr = new Suta();
                        break;
                case 'D': expr = new CinciSute();
                        break;
                case 'M': expr = new Mie();
                        break;
            }
            expr.interpretor(rezultat);
        }
        return String.valueOf(rezultat.returneazaFinal());
    }

	//functia principala care lanseaza modulul grafic
	public static void main(String[] args) {
		Principal p = new Principal();
		p.creareMediuGrafic();
	}
}
    